package com.cn.exception.hm;

import java.util.Scanner;

/**
 * 自定义异常
 *
 * 1. 自定义异常概述
 *   当Java中提供的异常不能满足我们的需求时,我们可以自定义异常
 *
 * 2. 实现步骤
 *   1. 定义异常类
 *   2. 写继承关系
 *   3. 提供空参构造
 *   4. 提供带参构造
 *
 */
public class Exception_06_SelfDefinedException {
    public static void main(String[] args) {
        // 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,
        // 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。
        Student student = new Student();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = sc.nextLine();
        student.setName(name);
        while(true){
            System.out.println("请输入年龄:");
            String ageStr = sc.nextLine();
            try{
                int age = Integer.parseInt(ageStr);
                student.setAge(age);
                break;
            }catch (NumberFormatException e){
                System.out.println("请输入一个整数");
                continue;
            }catch (AgeOutOfBoundsException e){
                System.out.println(e.toString());
                System.out.println("请输入一个符合范围的年龄");
                continue;
            }
        }
        System.out.println(student);

    }
}

class AgeOutOfBoundsException extends RuntimeException{
    public AgeOutOfBoundsException(){}

    public AgeOutOfBoundsException(String message){
        super(message);
    }

}

class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 18 && age <= 25){
            this.age = age;
        }else{
            //如果Java中提供的异常不能满足我们的需求,我们可以使用自定义的异常
            throw new AgeOutOfBoundsException("年龄超出了范围");
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}